#include "Thread.hpp"
#include <unistd.h>
#include <memory>
#include <mutex>

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

// void *start_routine(void *args)
// {
//     std::string name = static_cast<const char*>(args);
//     int cnt = 10;
//     while(cnt--)
//     {
//         std::cout << "new thread : " << name << std::endl;
//         sleep(1);
//     }
//     return nullptr;
// }

// int main()
// {

//     Thread t1(start_routine, (void*)"loadwork", 1);
//     Thread t2(start_routine, (void*)"hellowork", 2);
//     Thread t3(start_routine, (void*)"network", 3);
//     sleep(1);
//     std::cout << "main thread ..." << std::endl;
    
//     t1.join();
//     t2.join();
//     t3.join();

   
//     return 0;
// }


int tickets = 10000;

void *get_tickets(void *args)
{
    std::string name = static_cast<const char*>(args);
    while(true)
    {
        pthread_mutex_lock(&lock);
        if(tickets > 0)
        {
            usleep(1234);
            std::cout << "我正在抢票 : " << tickets-- << std::endl;
            pthread_mutex_unlock(&lock);
        }
        else 
        {
            pthread_mutex_unlock(&lock);
            break;
        }
    }

    return nullptr;
}


int main()
{
    std::unique_ptr<Thread> t1(new Thread(get_tickets, (void*)"user1", 1));
    std::unique_ptr<Thread> t2(new Thread(get_tickets, (void*)"user2", 2));
    std::unique_ptr<Thread> t3(new Thread(get_tickets, (void*)"user3", 3));
    std::unique_ptr<Thread> t4(new Thread(get_tickets, (void*)"user4", 4));

    t1->join();
    t2->join();
    t3->join();
    t4->join();


    return 0;
}



// #include <iostream>
// #include <cstring>
// #include <string>
// #include <pthread.h>
// #include <unistd.h>

// using namespace std;

// int g_val_1 = 100;              // 全局变量，主线程，新线程是共享的

// // 添加__thread，可以将一个内置类型设置为线程局部存储
// __thread int g_val_2 = 100;     // 线程局部存储，每个线程被创建时，与生俱来的栈上就有一个g_val_2，每个线程互不干扰

// string changeid(const pthread_t &tid)
// {
//     char thread_id[128];
//     snprintf(thread_id, sizeof(thread_id), "0x%x", tid);
//     return thread_id;
// }


// void *start_routine(void *args)
// {
//     string name = static_cast<const char*>(args);
//     pthread_detach(pthread_self()); // 将自己的状态设置为分离状态
//     int cnt = 5;
//     while(cnt--)
//     {
//         cout << "name : " << name << " ; g_val_1: " << g_val_1++ << " ; &g_val_1: " << &g_val_1 /*<<" tid : " << changeid(pthread_self()) */<< endl;
//         cout << "name : " << name << " ; g_val_2: " << g_val_2++ << " ; &g_val_2: " << &g_val_2 /*<<" tid : " << changeid(pthread_self()) */<< endl;
//         sleep(1);
//     }
//     return nullptr;
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, start_routine, (void*)"new thread one");
//     pthread_detach(tid);    // 线程分离，后续不用join这个线程，如果join就会出错(pthread_join会返回错误码)


//     // pthread_self():谁调用它，返回谁的pthread_t类型的id值

//     // 一个线程默认是joinable的，一旦设置了分离状态，就不能进行等待了
//     // int n = pthread_join(tid, nullptr);
//     // cout << "result : " << n << " msg : " << strerror(n) << endl;

//     while(true)
//     {
//         // cout << "main thread...; new thread_id : " << changeid(tid) << endl;
//         // cout << "main thread...; my thread_id : " << changeid(pthread_self()) << endl;
//         cout << "main thread...: " << " ; g_val_1: " << g_val_1 << " ; &g_val_1: " << &g_val_1 /*<<" tid : " << changeid(pthread_self()) */<< endl;
//         cout << "main thread...: " << " ; g_val_2: " << g_val_2 << " ; &g_val_2: " << &g_val_2 /*<<" tid : " << changeid(pthread_self()) */<< endl;
//         sleep(1);
//     }

//     return 0;
// }



